home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / INTERNET / SITES / LITTLE / BMSRC.ZIP / KEYBOARD.S < prev    next >
Encoding:
Text File  |  1996-06-23  |  7.3 KB  |  350 lines

  1. *=======================================================*
  2. *    IKBD routines: latest update 25/03/96        *
  3. *=======================================================*
  4. *    Handle keyboard & mouse                *
  5. *=======================================================*
  6.  
  7. ikbd        =    $118        ; keyboard vector
  8. key_ctl        =    $fffffc00    ; keyboard control register
  9. key_dat        =    $fffffc02    ; keyboard data register
  10.  
  11.     ifnd    debuggable
  12.  
  13. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  14. * Initialise custom keyboard packet handler        *
  15. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  16. initialise_ikbd:
  17. *-------------------------------------------------------*
  18.     lea    key_buffer,a0
  19.     moveq    #128/4-1,d7
  20. .clear_keybd:
  21.     clr.l    (a0)+
  22.     dbf    d7,.clear_keybd
  23.     bsr    flush_ikbd
  24.     move.l    ikbd.w,old_ikbd
  25.     move.l    #ikbd_handler,ikbd.w
  26.     rts
  27.  
  28. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  29. * Remove custom keyboard packet handler            *
  30. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  31. remove_ikbd:
  32. *-------------------------------------------------------*
  33.     bsr    flush_ikbd
  34.     move.l    old_ikbd,ikbd.w
  35.     rts
  36.  
  37. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  38. * Remove unread data from ikbd chip            *
  39. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  40. flush_ikbd:
  41. *-------------------------------------------------------*
  42. .wl:    tst.b    key_dat.w
  43.     bpl.s    .wl
  44.     move.b    key_ctl.w,d0
  45.     btst    #0,d0
  46.     bne.s    .read
  47.     rts
  48. .read    move.b    key_dat.w,d0
  49.     bra.s    flush_ikbd
  50.  
  51. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  52. * Keyboard Packet handler                *
  53. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  54.     txtlong
  55. *-------------------------------------------------------*
  56. ikbd_handler:
  57. *-------------------------------------------------------*
  58.     movem.l    a0/d0-d1,-(sp)
  59.  
  60. ikbd_loop:
  61.     move.b    key_ctl.w,d0
  62.  
  63.     btst    #7,d0
  64.     beq.s    ikbd_aq2
  65.  
  66.     btst    #4,d0
  67.     bne.s    ik_err
  68.     btst    #5,d0
  69.     bne.s    ik_err
  70.     btst    #6,d0
  71.     bne.s    ik_err
  72.     btst    #0,d0
  73.     beq.s    ik_err
  74.  
  75.     move.b    key_dat.w,d0
  76.  
  77.     cmp.b    #$ff,d0            ; joystick 1 packet
  78.     beq.s    do_joy1
  79.     cmp.b    #$fe,d0            ; joystick 0 packet
  80.     beq.s    do_joy0
  81.  
  82. mouse_event:
  83.     move.b    d0,d1
  84.     and.b    #$fc,d1            ; %111110xx = mouse packet 
  85.     cmp.b    #$f8,d1
  86.     bne.s    key_press
  87.     and.b    #3,d0
  88.     move.b    d0,buttons
  89.     move.l    #get_dx,ikbd.w
  90.     bra.s    ikbd_aq
  91.  
  92. do_joy0:
  93. ;    move.l    #get_joy0,ikbd.w
  94.     bra.s    ikbd_aq
  95.  
  96. do_joy1:
  97. ;    move.l    #get_joy1,ikbd.w
  98.     bra.s    ikbd_aq
  99.  
  100.  
  101. key_press:
  102.     btst    #7,d0            ; test release bit
  103.     seq    d1            ; d1.b cleared if release bit set
  104.     and.w    #$7f,d0            ; mask off release bit
  105.     lea    key_buffer,a0
  106.     move.b    d1,(a0,d0.w)
  107.  
  108. ikbd_aq:
  109.  
  110.     btst    #0,key_ctl.w
  111.     bne    ikbd_loop
  112.  
  113. ikbd_aq2:
  114.     
  115.     bclr    #6,$fffffa11.w
  116.     movem.l    (sp)+,a0/d0-d1
  117.     rte
  118.  
  119.  
  120. ik_err:    move.l    #ikbd_handler,ikbd.w
  121. .ikl:    btst    #0,key_ctl.w
  122.     beq.s    .clr
  123.     move.b    key_dat.w,d0
  124.     bra.s    .ikl
  125. .clr:    bra.s    ikbd_aq
  126.  
  127. get_dx:
  128.     movem.l    a0/d0-d1,-(sp)
  129.  
  130.     move.b    key_ctl.w,d0
  131.     btst    #4,d0
  132.     bne.s    ik_err
  133.     btst    #5,d0
  134.     bne.s    ik_err
  135.     btst    #6,d0
  136.     bne.s    ik_err
  137.     btst    #0,d0
  138.     beq.s    ik_err
  139.  
  140.     move.b    key_dat.w,d0
  141.     ext.w    d0
  142.     add    d0,mouse_dx
  143.     move.l    #get_dy,ikbd.w
  144.  
  145.     bra.s    ikbd_aq
  146.  
  147. get_dy:
  148.     movem.l    a0/d0-d1,-(sp)
  149.  
  150.     move.b    key_ctl.w,d0
  151.     btst    #4,d0
  152.     bne.s    ik_err
  153.     btst    #5,d0
  154.     bne.s    ik_err
  155.     btst    #6,d0
  156.     bne.s    ik_err
  157.     btst    #0,d0
  158.     beq.s    ik_err
  159.  
  160.     move.b    key_dat.w,d0
  161.     ext.w    d0
  162.     add    d0,mouse_dy
  163.     move.l    #ikbd_handler,ikbd.w
  164.  
  165.     bra    ikbd_aq
  166.  
  167. get_joy1:
  168.     move.b    key_dat.w,joy0
  169.     move.l    #ikbd_handler,ikbd.w
  170.     bclr    #6,$fffffa11.w
  171.     rte
  172.  
  173. get_joy0:
  174.     move.b    key_dat.w,joy1
  175.     move.l    #ikbd_handler,ikbd.w
  176.     bclr    #6,$fffffa11.w
  177.     rte
  178.  
  179.     elseif
  180.  
  181. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  182. * Initialise custom keyboard packet handler        *
  183. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  184. initialise_ikbd:
  185. *-------------------------------------------------------*
  186.     lea        key_buffer,a0
  187.     moveq        #128/4-1,d7
  188. .clear_keybd:
  189.     clr.l        (a0)+
  190.     dbf        d7,.clear_keybd
  191.     bsr        flush_ikbd
  192.  
  193.     move.w        #34,-(sp)
  194.     trap        #14
  195.     addq.l        #2,sp
  196.     move.l        d0,a0
  197.     move.l        16(a0),old_mousevec
  198.     move.l        #Handle_Mouse,16(a0)
  199.  
  200.     move.w        #1,-(sp)
  201.     move.w        #14,-(sp)
  202.     trap        #14
  203.     addq.w        #4,sp
  204.     move.l        d0,key_recptr
  205.  
  206.     rts
  207.  
  208. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  209. * Remove custom keyboard packet handler            *
  210. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  211. remove_ikbd:
  212. *-------------------------------------------------------*
  213.     bsr        flush_ikbd
  214.     move.w        #34,-(sp)
  215.     trap        #14
  216.     addq.l        #2,sp
  217.     move.l        d0,a0
  218.     move.l        old_mousevec,16(a0)
  219.     rts
  220.  
  221. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  222. * Handle mouse packet                    *
  223. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  224.     txtlong
  225. *-------------------------------------------------------*
  226. Handle_Mouse:
  227. *-------------------------------------------------------*
  228.     movem.l        d0/a0,-(sp)
  229.     move.b        (a0)+,d0
  230.     and.b        #3,d0
  231.     move.b        d0,buttons
  232.  
  233.     move.b        (a0)+,d0
  234.     ext.w        d0
  235.     add.w        d0,mouse_dx
  236.  
  237.     move.b        (a0)+,d0
  238.     ext.w        d0
  239.     add.w        d0,mouse_dy
  240.  
  241.     movem.l        (sp)+,d0/a0
  242.     rts
  243.  
  244.         
  245. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  246. * Flush gem keyboard routine.                *
  247. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  248. flush_ikbd:
  249. *-------------------------------------------------------*
  250.     bra        empty_buffer
  251.  
  252. *-------------------------------------------------------*
  253.     txtlong
  254. *-------------------------------------------------------*
  255. read_key:
  256. *-------------------------------------------------------*
  257.     move.w        last_key,d0
  258.     lea        key_buffer,a0
  259.     sf        (a0,d0.w)
  260.     bsr        read_keybuf
  261.     and.w        #$7f,d0
  262.     move.w        d0,last_key
  263.     st        (a0,d0.w)
  264.     rts
  265.  
  266. *-------------------------------------------------------*
  267. * Init the GEMDOS key buffer reader
  268. *-------------------------------------------------------*
  269. * IOrec structure
  270.  
  271.         rsreset
  272. ibuf        rs.l    1
  273. ibufsize    rs.w    1    
  274. ibufhd        rs.w    1
  275. ibuftl        rs.w    1
  276.  
  277. *-------------------------------------------------------*
  278. * Read the GEMDOS key buffer
  279. * returns scancode/ascii value in d0,d1
  280. * or -1 if no key
  281. *-------------------------------------------------------*
  282.     txtlong
  283. *-------------------------------------------------------*
  284. read_keybuf:
  285. *-------------------------------------------------------*
  286.     movem.l    d2-d7/a0-a6,-(sp)
  287.  
  288.     move.l    key_recptr,a0
  289.     move.w    ibufhd(a0),d1
  290.     move.l    ibuf(a0),a1
  291.  
  292.     cmp.w    ibuftl(a0),d1
  293.     beq.s    .nokey
  294.     addq.w    #4,d1
  295.     cmp.w    ibufsize(a0),d1
  296.     blt.s    .nomod
  297.     moveq    #0,d1
  298. .nomod
  299.     move.w    d1,ibufhd(a0)
  300.     move.w    d1,ibuftl(a0)
  301. .noinc
  302.     movem.w    (a1,d1.w),d0-d1
  303.     bra.s    .gotkey
  304. .nokey
  305.     moveq    #-1,d0
  306.     moveq    #-1,d1
  307. .gotkey
  308.     movem.l    (sp)+,d2-d7/a0-a6
  309.     rts
  310.     
  311.  
  312.         endc
  313.  
  314. *-------------------------------------------------------*
  315. *    Flush keyboard buffer                *
  316. *-------------------------------------------------------*
  317. empty_buffer:
  318. *-------------------------------------------------------*
  319. .bk    push.w        #11
  320.     trap        #1
  321.     addq        #2,sp
  322.     tst.w        d0
  323.     beq.s        .ot
  324.     move.w        #7,-(sp)
  325.     trap        #1
  326.     addq        #2,sp
  327.     bra.s        .bk
  328. .ot    rts
  329.  
  330. *-------------------------------------------------------*
  331.             bsslong
  332. *-------------------------------------------------------*
  333.  
  334. old_ikbd:        ds.l    1
  335. old_mousevec:        ds.l    1
  336. key_recptr:        ds.l    1
  337. key_buffer:        ds.b    128
  338.  
  339. last_key:        ds.w    1
  340. mouse_dx:        ds.w    1
  341. mouse_dy:        ds.w    1
  342.  
  343. joy0:            ds.b    1
  344. joy1:            ds.b    1
  345. buttons:        ds.b    1
  346.  
  347. *-------------------------------------------------------*
  348.             txtlong
  349. *-------------------------------------------------------*
  350.